#include "fifo.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * 函数：模拟FIFO（先进先出）页面置换算法。
 *
 * @param queue_frames 一个字符串，表示页面访问序列。
 *                     字符串中的每个字符是一个数字，表示一个页面号。
 * @param num_frames   页框的数量，表示物理内存中可用的页框数。
 */
void
fifo_page_replacement (char *queue_frames, int num_frames)
{
  int *frames = (int *)malloc(num_frames * sizeof(int));
  // 初始化页框，用 -1 表示为空
  for (int i = 0; i < num_frames; i++) {
      frames[i] = -1;
  }
  int front = 0;  // 指向最早进入页框的位置，模拟队列的头
  char *token = strtok(queue_frames, ","); //使用 strtok 函数将页面访问序列字符串按逗号分割，逐个处理页面访问。
  while (token != NULL) {
      int page_num = atoi(token); //int atoi(const char *str); //将字符串转换为整数
      int found = 0;
      // 检查页面是否已在内存中
      for (int i = 0; i < num_frames; i++) {
          if (frames[i] == page_num) {
              found = 1;
              break;
          }
      }
      // 如果页面不在内存中，则进行置换
      if (!found) {
          frames[front] = page_num;
          front = (front + 1) % num_frames;
      }
      // 输出当前内存状态
      printf("Access:%d,Frames: [", page_num);
      for (int i = 0; i < num_frames; i++) {
          if (i != 0) {
              printf(",");
          }
          if (frames[i] != -1) {
              printf("%d", frames[i]);
          } else {
              printf("-1");
          }
      }
      printf("]\n");
      token = strtok(NULL, ",");
  }
 //printf("\n");
  free(frames);
}
